import { _decorator, Component, EventTouch, Input, input, misc, Node, Quat, SceneAsset, Vec2, Vec3 } from 'cc';
const { ccclass, property } = _decorator;


enum tipscurState{
    MOVE,
    ROTATE,
    REVERSAL
}

@ccclass('tip2Script1')
export class tip2Script1 extends Component {

    curcurState:tipscurState = null

    clickInterval:number =  0.3  // 双击间隔时间，单位秒
    lastClickTime:number =  0   // 上次点击时间

    private startTouchPos: Vec2 = new Vec2(0, 0);  // 起始触摸位置
    private startAngle: number = 0;  // 记录触摸时的旋转角度
    
    


    start() {
        this.curcurState = tipscurState.MOVE
        input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this)
        input.on(Input.EventType.TOUCH_END, this.onTouchEnd, this)
        this.node.on(Node.EventType.TOUCH_START, this.onTouchStart, this);

    }

    update(deltaTime: number) {
        
    }

    onTouchStart(event: EventTouch) {
        // 记录触摸的起始位置
        this.startTouchPos = event.getLocation();
        
        // 计算当前触摸点与节点中心的角度
        this.startAngle = this.getAngleFromNodeCenter(this.startTouchPos);

    }
    onTouchMove(event: EventTouch){
        // 如果是可移动状态，允许节点移动
        if (this.curcurState === tipscurState.MOVE) {
            // let touchLocation = event.getLocation();
            this.node.setPosition(new Vec3(event.getUIDelta().x, event.getUIDelta().y))
        }
        // 如果是可旋转状态，允许节点旋转
        else if (this.curcurState === tipscurState.ROTATE) {
            // 获取当前触摸点位置
        const currentTouchPos = event.getLocation();

        // 计算当前触摸点与节点中心的角度
        const currentAngle = this.getAngleFromNodeCenter(currentTouchPos);

        // 计算角度差值
        const angleDelta = currentAngle - this.startAngle;

        // 更新节点的旋转角度
        this.node.angle = this.node.angle + angleDelta;

        // 更新触摸起始角度，以便下一次计算
        this.startAngle = currentAngle;
        }

    }

    private getAngleFromNodeCenter(touchPos: Vec2): number {
        const nodePos = this.node.position;  // 节点的世界位置
        const dx = touchPos.x - nodePos.x;  // 触摸点与节点的X轴差值
        const dy = touchPos.y - nodePos.y;  // 触摸点与节点的Y轴差值
        
        // 使用 atan2 函数来计算角度
        const angleInRadians = Math.atan2(dy, dx);
        
        // 转换为角度（度数）
        return misc.radiansToDegrees(angleInRadians);
    }

     // 计算两点之间的角度

    private getAngle(start: Vec2, end: Vec2): number {
        const dx = end.x - start.x;
        const dy = end.y - start.y;
        return misc.radiansToDegrees(Math.atan2(dy, dx));
    }

    // 平滑旋转角度：对旋转角度进行插值，减少突变
    private smoothRotation(lastRotation: number, targetRotation: number): number {
        const angleDiff = targetRotation - lastRotation;
        // 将角度差限制在 -180 到 180 之间，避免绕过 0 度引起的跳变
        const angle = ((angleDiff + 180) % 360) - 180;
        // 以某个速度平滑过渡，0.1 控制平滑度（可以调整该值）
        return lastRotation + angle * 0.05;
    }


    onTouchEnd(event: EventTouch){
        const currentTime = new Date().getTime() / 1000; // 获取当前时间戳（秒）

        // 判断是否为双击
        if (currentTime - this.lastClickTime < this.clickInterval) {
            this.onDoubleClick(event);  // 双击回调
        } else {
            this.onSingleClick(event);  // 单击回调
        }

        // 更新上次点击时间
        this.lastClickTime = currentTime;
        
        
    }


    protected onDisable(): void {
        input.off(Input.EventType.TOUCH_MOVE, this.onTouchMove, this)
    }

    onSingleClick(event){
        if (this.curcurState === tipscurState.MOVE ) {
            this.curcurState = tipscurState.ROTATE;
            console.log("Entering ROTATABLE curState!");
        } else if (this.curcurState === tipscurState.ROTATE) {
            this.curcurState = tipscurState.MOVE;
            console.log("Returning to MOVABLE curState!");
        }
        console.log("one click");
    }

    onDoubleClick(event){
       // 获取当前的节点缩放
       const scale = this.node.scale;

       let X = scale.x
       // 反转节点的 X 轴对称（即镜像翻转）
       X = scale.x > 0 ? -0.5 : 0.5;  // 当 scale.x 为正时，反转为负，否则反转为正

       // 如果需要反转 Y 轴，可以类似操作
       // scale.y = scale.y > 0 ? -1 : 1;

       // 更新节点的 scale
       this.node.setScale(new Vec3(X,scale.y,scale.z));


    }
}


